package com.itany.corejava.code07_面向对象.bms;

import java.util.Scanner;

/**
 * @author 石小俊
 * @date 2023年04月21日 16:09
 * 银行管理系统入口
 */
public class Start {

    private Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
//        Start start = new Start();
//        start.showMenu();
        new Start().showMenu();
    }

    public void showMenu() {
        System.out.println("******************************欢迎进入银行管理系统******************************");
        System.out.print("请选择服务的功能(1.开户 2.登录):");
        int choice = sc.nextInt();
        switch (choice) {
            case 1:
                // 开户方法
                register();
                break;
            case 2:
                // 登录方法
                login();
                break;
            default:
                System.out.println("您输入的选项有误,请重新输入!");
                break;
        }
    }

    public void register() {
        System.out.print("请选择开户的账户类型(1.储蓄账户 2.信用账户 3.贷款的储蓄账户 4.贷款的信用账户):");
        int choice = sc.nextInt();
        Account account = null;
        // 根据账户类型不同,实例化不同的子类
        // 在实例化子类的时候账户编号需要自增
        // 在父类无参构造方法中已经实现了账户编号自增
        // 实例化的时候直接调用子类的无参构造方法
        // 此时会自动调用到父类的无参构造方法使得账户编号自增
        switch (choice) {
            case 1:
                account = new SavingAccount();
                break;
            case 2:
                account = new CreditAccount();
                break;
            case 3:
                account = new LoanSavingAccount();
                break;
            case 4:
                account = new LoanCreditAccount();
                break;
            default:
                System.out.println("您输入的选项有误,请重新输入");
                register();
        }

        // 输入账户信息
        System.out.print("请输入户主姓名:");
        account.setName(sc.next());

        // 密码输入两次,两次必须一致
        // 如果两次输入的密码不一致,则重新输入,直到一致为止
        while (true) {
            System.out.print("请输入密码:");
            String password = sc.next();
            System.out.print("请再次输入密码:");
            String password2 = sc.next();
            // 判断两次输入的密码是否一致
            if (password.equals(password2)) {
                // 如果两次输入的密码一致,则设置密码
                account.setPassword(password);
                // 且退出当前循环
                break;
            } else {
                System.out.println("错误:两次输入的密码不一致,请重新输入!");
            }
        }
        System.out.print("请输入您的身份证号码:");
        account.setPersonId(sc.next());
        System.out.print("请输入您的手机号码:");
        account.setPhone(sc.next());

        // 开户的时候,账户余额为0即可
        // 如果是信用账户,设置可透支额度
        // 向下转型
        if (account instanceof CreditAccount) {
            // 如果可以向下转型,说明当前账户是一个信用账户或者贷款的信用账户
            // 将其转换成信用账户,用于设置可透支额度
            CreditAccount creditAccount = (CreditAccount) account;
            System.out.print("请输入可透支额度:");
            creditAccount.setLimit(sc.nextDouble());
        }

        // 由于开户的信息需要保存到银行中,否则后面登录的时候无法查询到
        // 调用银行类提供的开户方法,将当前开户的账户对象传递到银行类的方法中
        boolean flag = Bank.register(account);
        if (flag) {
            // 如果成功
            System.out.println("提示:恭喜您,开户成功,您的账户号为:" + account.getId());
        } else {
            // 如果失败
            System.out.println("错误:对不起,开户失败!");
        }
        // 开户完成之后回到主菜单选择继续开户还是登录
        showMenu();
    }

    public void login() {
        // 输入账户编号
        System.out.print("请输入账户编号:");
        int id = sc.nextInt();
        // 输入账户密码
        System.out.print("请输入账户密码:");
        String password = sc.next();

        // 调用银行类提供的登录方法,返回登录的账户信息
        Account account = Bank.login(id, password);
        if (account != null) {
            // 如果账户不为空,说明登录成功
            // 登录成功之后进入银行主菜单
            System.out.println("---------------------------------------");
            System.out.println("欢迎您:" + account.getName());
            new AccountMenu(account).showMainMenu();
        } else {
            // 否则登录失败
            System.out.println("错误:卡号或密码错误!");
            showMenu();
        }
    }
}
